package com.sun.jdk.date.jdk8after;

import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalQuery;

/**
 * 二十三、TemporalQuery的应用
 * 学习的时态类对象（LocalDate，LocalTime）都有一个方法叫做query，
 * 可以针对日期进行查询，R query(TemporalQuery query)这个方法是一个泛型方法，返回的数据就是传入的泛型类的类型，
 * TemporalQuery是一个泛型接口，里面有一个抽象方法是R queryFrom(TemporalAccessor temporal)，TemporalAccessor是Temporal的父接口，
 * 实际上也就是LocalDate,LocalDateTime相关类的顶级父接口，这个queryFrom的方法的实现逻辑就是，传入一个日期/时间对象通过自定义逻辑返回数据。
 *
 * 如果要计划日期距离某一天特定天数差距多少天，可以自定义类实现TemporalQuery接口并且作为参数传到query方法中。
 *
 * 例如：计算当前时间距离下一个劳动节还有多少天？
 *
 * 作者：一双看向未来的眼睛
 * 链接：https://www.jianshu.com/p/7a1b367ae95f
 * 来源：简书
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 */
public class TemporalQueryPractise {

    private static void test1(){
        LocalDate now = LocalDate.now();
        Long day = now.query(new UtilDayQueryImpl());
        // 现在的时间
        System.out.println("现在的时间："+now);
        // 距离下一个五一劳动节的时间
        System.out.println("距离下一个五一劳动节还有："+day+"天");

    }

    public static void main(String[] args) {
        test1();
    }

}

class UtilDayQueryImpl implements TemporalQuery<Long>{

    @Override
    public Long queryFrom(TemporalAccessor temporal) {
        LocalDate now = LocalDate.from(temporal);
        // 封装当年的劳动节时间
        LocalDate laborDay = LocalDate.of(now.getYear(), Month.MAY, 1);
        // 判断当前时间是否已经超过了当年的劳动节，如果超过了当年的劳动节，则laborDay+1年
        if(now.isAfter(laborDay)){
            laborDay = laborDay.plusYears(1);
        }
        // 计算从当前时间到下一个五一劳动节的天数
        long days = ChronoUnit.DAYS.between(now, laborDay);
        return days;
    }
}
